//lock_guard是C++标准库中的一种互斥量封装类，用于保护共享数据，防止多个线程同时访问统一资源而导致的数据竞争问题
/*
lock_guard特点:
1.构造函数被调用时，该互斥量会被自动锁定
2.当析构函数被调用时，该互斥量会自动解锁
3.std::lock_guard对象不能复制或移动，因此它智能在局部作用域中使用

*/


#include<iostream>
#include<thread>
#include<mutex>

int share_data = 0;
std::mutex mtx;

void func()
{
	for (int i = 0; i < 10000; i++)
	{
		std::lock_guard<std::mutex> lg(mtx);	//自动上锁解锁，不再需要手动上锁解锁
		//mtx.lock();
		share_data++;
		//mtx.unlock();
	}
}

int main()
{
	std::thread t1(func);
	std::thread t2(func);

	t1.join();
	t2.join();

	std::cout << share_data << std::endl;

	return 0;
}










//unique_lock是C++标准库中提供的一个互斥量封装类，用于在多线程程序中对互斥量进行上锁和解锁操作。
//他的主要特点是可以对互斥量进行更加灵活的管理，包括延迟上锁，条件变量，超时等。


try_lock();	//尝试上锁，若已经被别的上锁则返回false，否则true


try_lock_for();	//阻塞在此处，不断尝试上锁，直到上锁成功或者超过了指定时间段，才继续往下走

try_lock_until();	//同上,try_lock_until();	//同上,但参数是时间点，等到该时间点若没有上锁成功就返回。（不常用）




#include<iostream>
#include<thread>
#include<mutex>

int share_data = 0;
std::timed_mutex mtx;	//涉及时间得用时间锁

void func()
{
	for (int i = 0; i < 2; i++)
	{
		//(1)同lock_guard
		//std::unique_lock<std::mutex> lg(mtx);	//自动上锁解锁，不再需要手动上锁解锁

		//(2)构造但是不加锁，因为还有其他的加锁方案
		std::unique_lock<std::timed_mutex> lg(mtx, std::defer_lock);	//多了一个参数
		if (lg.try_lock_for(std::chrono::seconds(2)))		//等待2秒
		{
			std::this_thread::sleep_for(std::chrono::seconds(1));	//休眠1秒
			share_data++;

		}

		
	}
}

int main()
{
	std::thread t1(func);
	std::thread t2(func);

	t1.join();
	t2.join();

	std::cout << share_data << std::endl;			//最终结果不定可能是3可能是4	解释3：每个线程加两次，一共四次若前两次都是t1，那么休眠了2秒，第一个t2不再等待，跳过到第二个t2，就只有3

	return 0;
}